#pragma once

#include <Eigen/Dense>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <memory>

namespace lio_ndt {

class Registration {
public:
    using PointT = pcl::PointXYZ;
    using CloudPtr = pcl::PointCloud<PointT>::Ptr;  // 本质是boost::shared_ptr

    virtual ~Registration() = default;

    virtual double GetFitnessScore() const { 
        return -1.0; 
    }

    virtual bool SetTargetCloud(const CloudPtr& target) = 0;

    virtual bool ScanMatch(const CloudPtr& source,
                           const Eigen::Matrix4f& predict_pose,
                           CloudPtr& transformed_source,
                           Eigen::Matrix4f& result_pose) = 0;
};

}  // namespace lio_ndt
